package com.eclipse.e20200205_集合.HashSet_LinkedHashSet;

import java.util.HashSet;
import java.util.Set;

class Cat{
	String name;
	Cat(String name){
		this.name = name;
	}
	@Override
	public int hashCode() {
		//如果属性相同  返回相同的hashCode
		//属于不同，hashcode就不相同
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cat other = (Cat) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	//不覆盖hashCode会帮你生成一个唯一的值(每次生成 的值，都不一样)
 /* 	public int hashCode() {
		System.out.println("执行了hashCode");
		return 10;
	}
	
	public boolean equals(Object obj) {
		System.out.println("执行了equals");
		return  false;
	}*/
	
	
	
	
}

public class 去重 {
	public static void main(String[] args) {
		
		//hashCode每一个对象都 会一个hashCode
		Cat c1 = new Cat("mm");
		Cat c2 = new Cat("mm");
		//System.out.println(c);
		//System.out.println(c.hashCode());
		//hashCode就是跟内存地址对应的一个编号    
		//编号就是对应你内存的地址
		//每一个对象的hashCode都是不一样
		
		Set<Cat> s = new HashSet<>();
		//1.添加一个对象时，会调用对象的hashCode
		//hashCode不相同，c2对象和集合当中的hashCode不相同 ，就不会调用equals
		s.add(c1);
		s.add(c2);
		//当hashCode相同的时候，会调用equals  如果equals返回为true 就不添加到集合当中
		System.out.println(s);
	}
}
